package com.bdan.t382.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Random;

@Aspect // 表示这是一个切面类
@Component // 结合扫描包，产生 bean 对象注入到 IoC 容器中
public class TransactionAspect {
private static final Logger log = LoggerFactory.getLogger(
         TransactionAspect.class);
@Pointcut("execution(* com.bdan.t382.service..*.*(..))")
public void pt(){}
 // 通过方法名进行引用，注意写法类似于调用方法需加小括号
         @Before(value="pt()")
public void before(JoinPoint jp) {
//             Random random = new Random();
//             int num = random.nextInt(10); // 生成 0-9 的随机数
//             System.out.println("打印机状态检测中... 检测结果：" + num);
    log.info("【TransactionAspect 前置增强】模拟打开数据库连接并开启事务...");
    log.info("SqlSession sqlSession = MyBatisUtil.createSqlSession(false);");
             //修改打印机的 print 方法，使用 Random 类生成 0-9 的随机，如果随机数小于 5，则正常打印，5-7 抛出卡纸异常，7-9 抛出墨盒无墨的异常。
//             if (num < 5) {
//                 System.out.println("打印机自检正常，可以正常打印");
//             } else if (num < 7) {
//                 System.out.println("打印机自检异常，检测到卡纸，请及时处理");
//             } else {
//                 System.out.println("打印机自检异常，墨盒无墨，请及时更换墨盒");
//             }
     }
 @AfterReturning(value="execution(* com.bdan.t382.service..*.*(..))", returning="result")
 public void afterReturning(JoinPoint jp, Object result) {
      log.info("【TransactionAspect 后置增强】模拟正常完成业务提交事务...");
      log.info("session.commit();");
      }
 @AfterThrowing(value="execution(* com.bdan.t382.service..*.*(..))", throwing = "e")
 public void afterThrowing(JoinPoint jp, Throwable e) {
      log.info("【TransactionAspect 异常抛出增强】模拟业务异常回滚事务，异常信息为："
      + e.getMessage());
      log.info("session.rollback();");
      }
 @After(value="execution(* com.bdan.t382.service..*.*(..))")
 public void after(JoinPoint jp) {
      log.info("【TransactionAspect 最终增强】模拟业务完成释放资源...");
      log.info("MyBatisUtil.closeSqlSession(sqlSession);");
      }
 }
